<?php


namespace app\api\controller\v1;

use app\api\validate\IDMustBePositiveInt;
use app\api\validate\OrderPlace;
use app\api\validate\Paginate;
use app\api\service\Token as TokenService;
use app\api\service\Order as OrderService;
use app\api\model\Order as OrderModel;
use app\common\exception\MissException;
use app\common\exception\OrderException;

//付款减库存
class Order extends Base
{

    protected $beforeActionList = [
        //只有user能访问
        'checkExclusiveScope' => ['only' => 'placeOrder'],
        //user和admin都能访问
        'checkPrimaryScope' => ['only' => 'getDetail,getSimpleListByUser,getAll'],
    ];
    //用户在选择商品后，向api提交商品信息
    //api接收到商品数据后，检测商品库存
    //有库存，把订单数据存到数据库，下单成功返回客户端消息
    //客户端调用支付接口，支付
    //再次检测库存
    //php后台调用微信支付接口，进行支付
    //小程序根据php后台返回的结果，拉起微信支付
    //（小程序端也会接收到一个结果）
    //微信向php后台返回支付结果（异步调用）
    // 支付成功：库存量检测（超卖），检测成功，更新订单status状态，库存量扣除，，
    // 支付失败：返回失败结果


    public function placeOrder()
    {
        (new OrderPlace())->goCheck();
        $products = input('post.products/a');
        (new IDMustBePositiveInt())->goCheck();
        $address_id = input('post.id/d');

        $uid = TokenService::getCurrentUID();

        $order = new OrderService();
        $status = $order->place($uid, $address_id, $products);

        return $status;
    }


    public function getSimpleListByUser($page = 1, $size = 15)
    {
        (new Paginate())->goCheck();
        $uid = TokenService::getCurrentUID();
        $pager = OrderModel::getSimpleListByUser($uid, $page, $size);
        if ($pager->isEmpty()) {
            return [
                'data' => [],
                'current_page' => $pager->currentPage()
            ];
        }

        $data = $pager->hidden(['snap_items', 'snap_address', 'prepay_id'])->toArray();
        return [
            'data' => $data,
            'current_page' => $pager->currentPage()
        ];
    }

    public function getAll($page = 1, $size = 15)
    {
        (new Paginate())->goCheck();
        $pager = OrderModel::getAll($page, $size);
        if ($pager->isEmpty()) {
            throw new OrderException([
                'msg' => '订单不存在',
            ]);
//            return [
//                'data' => [],
//                'current_page' => $pager->currentPage()
//            ];
        }
        $pager = $pager->hidden(['snap_items', 'snap_address', 'prepay_id']);
        $this->ok($pager);
    }

    public function getDetail($id)
    {
        (new IDMustBePositiveInt())->goCheck();
        $order = OrderModel::get($id);
        if (empty($order)) {
            throw new OrderException();
        }
        return $order->hidden(['prepay_id']);
    }

}


////下单冻结库存；超时释放库存；支付成功扣库存；支付失败只返回失败消息；取消订单，释放库存；
class Other
{

    public function createOrder()
    {
        //用户在选择商品后，向api提交商品信息
        //api接收到商品数据后，检测商品库存
        //有库存，冻结订单商品数量，同时把订单数据存到数据库，然后下单成功返回客户端消息
        //客户端调用支付接口支付，如果30分钟内不支付，算超时，超时就是定时任务执行取消订单操作，交给系统自己处理
        //php后台调用微信支付接口，进行支付
        //微信返回支付结果（异步调用）
        // 支付成功：冻结的库存量扣除掉，返回成功结果
        // 支付失败：返回失败结果


        /**
         * https://www.processon.com/view/5ce63da6e4b0ecdd20495484#map
         * 业务量没有达到百万级的公司，一般会采用订单生成后，冻结库存，等订单支付完成后，再扣减库存。
         * 业务量较大的公司，会采用订单生成后直接扣减库存，15分钟后订单失效，恢复库存。
         */
    }

    public function deleteOrder()
    {
        //取消订单，释放冻结商品数量
    }

    public function placeOrder()
    {
        //生成订单
    }

}